import os

import matplotlib.pyplot as plt
import numpy as np
from dateutil.utils import today
from numpy import sort
from openpyxl import Workbook, load_workbook
# y轴百分比、小数处理包
from matplotlib import ticker

# 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
wb = Workbook()
wb = load_workbook('直分图表数据py.xlsx', data_only=True)
sheet = wb['Sheet1']

DATE = [str(sheet['AC3'].value)[5:10], str(sheet['Y3'].value)[5:10], str(sheet['U3'].value)[5:10],
        str(sheet['Q3'].value)[5:10], str(sheet['M3'].value)[5:10],
        str(sheet['I3'].value)[5:10], str(sheet['E3'].value)[5:10]]
ZF_NUM1 = [float('%.2f' % (sheet['AD5'].value / 10000)), float('%.2f' % (sheet['Z5'].value / 10000)),
           float('%.2f' % (sheet['V5'].value / 10000)), float('%.2f' % (sheet['R5'].value / 10000)),
           float('%.2f' % (sheet['N5'].value / 10000)),
           float('%.2f' % (sheet['J5'].value / 10000)),
           float('%.2f' % (sheet['F5'].value / 10000))]
ZF_RATE1 = [sheet['AE5'].value, sheet['AA5'].value, sheet['W5'].value, sheet['S5'].value,
            sheet['O5'].value,
            sheet['K5'].value,
            sheet['G5'].value]
WC_RATE1 = [sheet['AF5'].value, sheet['AB5'].value, sheet['X5'].value, sheet['T5'].value,
            sheet['P5'].value,
            sheet['L5'].value,
            sheet['H5'].value]

ZF_NUM2 = [float('%.2f' % (sheet['AD24'].value / 10000)), float('%.2f' % (sheet['Z24'].value / 10000)),
           float('%.2f' % (sheet['V24'].value / 10000)), float('%.2f' % (sheet['R24'].value / 10000)),
           float('%.2f' % (sheet['N24'].value / 10000)),
           float('%.2f' % (sheet['J24'].value / 10000)),
           float('%.2f' % (sheet['F24'].value / 10000))]
ZF_RATE2 = [sheet['AE24'].value, sheet['AA24'].value, sheet['W24'].value, sheet['S24'].value,
            sheet['O24'].value,
            sheet['K24'].value,
            sheet['G24'].value]
WC_RATE2 = [sheet['AF24'].value, sheet['AB24'].value, sheet['X24'].value, sheet['T24'].value,
            sheet['P24'].value,
            sheet['L24'].value,
            sheet['H24'].value]

ZF_NUM3 = [float('%.2f' % (sheet['AD64'].value / 10000)), float('%.2f' % (sheet['Z64'].value / 10000)),
           float('%.2f' % (sheet['V64'].value / 10000)), float('%.2f' % (sheet['R64'].value / 10000)),
           float('%.2f' % (sheet['N64'].value / 10000)),
           float('%.2f' % (sheet['J64'].value / 10000)),
           float('%.2f' % (sheet['F64'].value / 10000))]
ZF_RATE3 = [sheet['AE64'].value, sheet['AA64'].value, sheet['W64'].value, sheet['S64'].value,
            sheet['O64'].value,
            sheet['K64'].value,
            sheet['G64'].value]
WC_RATE3 = [sheet['AF64'].value, sheet['AB64'].value, sheet['X64'].value, sheet['T64'].value,
            sheet['P64'].value,
            sheet['L64'].value,
            sheet['H64'].value]

ZF_NUM4 = [float('%.2f' % (sheet['AD86'].value / 10000)), float('%.2f' % (sheet['Z86'].value / 10000)),
           float('%.2f' % (sheet['V86'].value / 10000)), float('%.2f' % (sheet['R86'].value / 10000)),
           float('%.2f' % (sheet['N86'].value / 10000)),
           float('%.2f' % (sheet['J86'].value / 10000)),
           float('%.2f' % (sheet['F86'].value / 10000))]
ZF_RATE4 = [sheet['AE86'].value, sheet['AA86'].value, sheet['W86'].value, sheet['S86'].value,
            sheet['O86'].value,
            sheet['K86'].value,
            sheet['G86'].value]
WC_RATE4 = [sheet['AF86'].value, sheet['AB86'].value, sheet['X86'].value, sheet['T86'].value,
            sheet['P86'].value,
            sheet['L86'].value,
            sheet['H86'].value]

x1 = np.array(DATE)  # x_日期
y1 = np.array(ZF_NUM1)  # 华南直分量
y2 = np.array(ZF_RATE1)  # 华南直分率
y3 = np.array(WC_RATE1)  # 华南完成率

y4 = np.array(ZF_NUM2)  # 西南直分量
y5 = np.array(ZF_RATE2)  # 西南直分率
y6 = np.array(WC_RATE2)  # 西南完成率

y7 = np.array(ZF_NUM3)  # 华北直分量
y8 = np.array(ZF_RATE3)  # 华北直分率
y9 = np.array(WC_RATE3)  # 华北完成率

y10 = np.array(ZF_NUM4)  # 西北直分量
y11 = np.array(ZF_RATE4)  # 西北直分率
y12 = np.array(WC_RATE4)  # 西北完成率

fig = plt.figure(figsize=(12, 8))  # 创建一个figure；参数figsize=(10,5)，设置figure长宽
plt.suptitle(str(sheet['E3'].value)[5:10][0:2] + '月' + str(sheet['E3'].value)[5:10][3:5] + '日' + '大区直分进度（二）',
             fontsize=18)

ax1 = fig.add_subplot(221)  # 共（1*1）个子图，即本身
# 1.华南直分量
plt.bar(x1, y1, color='#00b050', width=0.5, label='直分量')  # 绘制直分量直方图
plt.title('华南近七日直分情况（指标251.1W）')
# plt.xlabel('日期')
plt.ylabel('直分量（万）')
# 根据近七日最大直分量确定y轴取值范围极限
y1_max = sort(y1)[6]
y1_lim = 251.1
# 根据近七日最大完成率确定y轴取值范围极限
y3_max = sort(y3)[6]
y3_lim = 1
plt.ylim((0, y1_lim))  # y轴取值范围
for i in range(0, 7):
    # 图表数据设置(x位置,y位置,值,字体大小,垂直格式,水平格式)
    plt.text(x1[i], y1[i], y1[i], fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
plt.plot(x1, y1, ':r')
# 2.华南直分占比
ax2 = ax1.twinx()  # 第二张图与第一张图共用x轴
ax2.plot(x1, y2, 'o:b', label='直分占比')  # 绘制直分率折线图
# 设置y轴取值0到1，刻度为0.2
y_ticks = np.arange(0, y3_lim, 0.2)
plt.yticks(y_ticks)
# 把y轴的float数据转为百分比形式，xmax最大为1（100%），decimals显示小数点后0位
ax2.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
# 循环显示各个y轴的数据值
for i in range(0, 7):
    plt.text(x1[i], y2[i], '%.2f%%' % (y2[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
# 3.华南完成率
ax3 = ax1.twinx()
ax3.plot(x1, y3, 'o:y', label='完成率')
fig.legend(loc='lower center', bbox_transform=ax1.transAxes, ncol=3)

y_ticks = np.arange(0, y3_lim, 0.2)
plt.yticks(y_ticks)
ax3.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
for i in range(0, 7):
    plt.text(x1[i], y3[i], '%.2f%%' % (y3[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
# -------------------------------------------------------------------------------------------------------------------------
ax1 = fig.add_subplot(222)
# 1.西南直分量
plt.bar(x1, y4, color='#00b050', width=0.5, label='直分量')  # 绘制直分量直方图
plt.title('西南近七日直分情况（指标82.3W）')
# plt.xlabel('日期')
plt.ylabel('直分量（万）')
# 根据近七日最大直分量确定y轴取值范围极限
y4_max = sort(y4)[6]
y4_lim = 82.3
# 根据近七日最大完成率确定y轴取值范围极限
y6_max = sort(y6)[6]
y6_lim = 1
plt.ylim((0, y4_lim))  # y轴取值范围
for i in range(0, 7):
    # 图表数据设置(x位置,y位置,值,字体大小,垂直格式,水平格式)
    plt.text(x1[i], y4[i], y4[i], fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
plt.plot(x1, y4, ':r')
# 2.西南直分占比
ax2 = ax1.twinx()  # 第二张图与第一张图共用x轴
ax2.plot(x1, y5, 'o:b', label='直分占比')  # 绘制直分率折线图
# 设置y轴取值0到1，刻度为0.2
y_ticks = np.arange(0, y6_lim, 0.2)
plt.yticks(y_ticks)
# 把y轴的float数据转为百分比形式，xmax最大为1（100%），decimals显示小数点后0位
ax2.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
# 循环显示各个y轴的数据值
for i in range(0, 7):
    plt.text(x1[i], y5[i], '%.2f%%' % (y5[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
# 3.西南完成率
ax3 = ax1.twinx()
ax3.plot(x1, y6, 'o:y', label='完成率')
y_ticks = np.arange(0, y6_lim, 0.2)
plt.yticks(y_ticks)
ax3.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
for i in range(0, 7):
    plt.text(x1[i], y6[i], '%.2f%%' % (y6[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
# -------------------------------------------------------------------------------------------------------------------------
ax1 = fig.add_subplot(223)
# 1.华北直分量
plt.bar(x1, y7, color='#00b050', width=0.5, label='直分量')  # 绘制直分量直方图
plt.title('华北近七日直分情况（指标74.0W）')
plt.xlabel('日期')
plt.ylabel('直分量（万）')
# 根据近七日最大直分量确定y轴取值范围极限
y7_max = sort(y7)[6]
y7_lim = 74
# 根据近七日最大完成率确定y轴取值范围极限
y9_max = sort(y9)[6]
y9_lim = 1
plt.ylim((0, y7_lim))  # y轴取值范围
for i in range(0, 7):
    # 图表数据设置(x位置,y位置,值,字体大小,垂直格式,水平格式)
    plt.text(x1[i], y7[i], y7[i], fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
plt.plot(x1, y7, ':r')
# 2.华北直分占比
ax2 = ax1.twinx()  # 第二张图与第一张图共用x轴
ax2.plot(x1, y8, 'o:b', label='直分占比')  # 绘制直分率折线图
# 设置y轴取值0到1，刻度为0.2
y_ticks = np.arange(0, y9_lim, 0.2)
plt.yticks(y_ticks)
# 把y轴的float数据转为百分比形式，xmax最大为1（100%），decimals显示小数点后0位
ax2.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
# 循环显示各个y轴的数据值
for i in range(0, 7):
    plt.text(x1[i], y8[i], '%.2f%%' % (y8[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
# 3.华北完成率
ax3 = ax1.twinx()
ax3.plot(x1, y9, 'o:y', label='完成率')
y_ticks = np.arange(0, y9_lim, 0.2)
plt.yticks(y_ticks)
ax3.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
for i in range(0, 7):
    plt.text(x1[i], y9[i], '%.2f%%' % (y9[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
# -------------------------------------------------------------------------------------------------------------------------
ax1 = fig.add_subplot(224)
# 1.西北直分量
plt.bar(x1, y10, color='#00b050', width=0.5, label='直分量')  # 绘制直分量直方图
plt.title('西北近七日直分情况（指标44.4W）')
plt.xlabel('日期')
plt.ylabel('直分量（万）')
# 根据近七日最大直分量确定y轴取值范围极限
y10_max = sort(y10)[6]
y10_lim = y10_max*1.4
# 根据近七日最大完成率确定y轴取值范围极限
y12_max = sort(y12)[6]
y12_lim = y12_max*1.4
plt.ylim((0, y10_lim))  # y轴取值范围
for i in range(0, 7):
    # 图表数据设置(x位置,y位置,值,字体大小,垂直格式,水平格式)
    plt.text(x1[i], y10[i], y10[i], fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
plt.plot(x1, y10, ':r')
# 2.西北直分占比
ax2 = ax1.twinx()  # 第二张图与第一张图共用x轴
ax2.plot(x1, y11, 'o:b', label='直分占比')  # 绘制直分率折线图
# 设置y轴取值0到1，刻度为0.2
y_ticks = np.arange(0, y12_lim, 0.2)
plt.yticks(y_ticks)
# 把y轴的float数据转为百分比形式，xmax最大为1（100%），decimals显示小数点后0位
ax2.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
# 循环显示各个y轴的数据值
for i in range(0, 7):
    plt.text(x1[i], y11[i], '%.2f%%' % (y11[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')
# 3.西北完成率
ax3 = ax1.twinx()
ax3.plot(x1, y12, 'o:y', label='完成率')
y_ticks = np.arange(0, y12_lim, 0.2)
plt.yticks(y_ticks)
ax3.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
for i in range(0, 7):
    plt.text(x1[i], y12[i], '%.2f%%' % (y12[i] * 100), fontsize=10, verticalalignment='bottom',
             horizontalalignment='center')

plt.show()
# plt.savefig(fname='D:\\Desktop\\直分图表\\直分量\\2023'+str(today())[5:7] + str(today())[8:10]+'\\02-华南西南华北西北-'+str(today())[5:7]+str(today())[8:10]+'.png')
# print('02华南西南华北西北'+str(today())[5:7]+str(today())[8:10]+'.png'+'已保存')
# os.system('python 直分曲线（华东）.py')
